package com.jms.framework.beans.factory;

import com.jms.framework.beans.ChildBeanDefinition;
import com.jms.framework.beans.context.BeanContext;

import java.lang.reflect.Method;

/**
 * 子Bean工厂类，用于创建由其他Bean负责创建的子Bean实例
 * 继承自AbstractBeanFactory，用于处理特定的ChildBeanDefinition
 *
 * @param <T> 泛型参数，表示将要创建的Bean类型
 */
public class ChildBeanFactory<T> extends AbstractBeanFactory<T> {

    // 保存Bean上下文，用于获取创建子Bean所需的父Bean实例
    private final BeanContext beanContext;

    /**
     * 构造方法，初始化ChildBeanFactory实例
     *
     * @param beanDefinition 子Bean的定义，包含创建Bean所需的信息
     * @param beanContext    Bean上下文，提供对其他Bean的访问
     */
    public ChildBeanFactory(ChildBeanDefinition beanDefinition, BeanContext beanContext) {
        super(beanDefinition);
        this.beanContext = beanContext;
    }

    /**
     * 创建并返回子Bean的实例
     * 如果子Bean定义中指定了创建者Bean的名称和方法，则通过该方法创建实例
     * 否则，返回null
     *
     * @return 创建的子Bean实例，如果无法创建则返回null
     * @throws Exception 如果创建过程中出现异常
     */
    @Override
    @SuppressWarnings("unchecked")
    public T getObject() throws Exception {
        // 强制转换为ChildBeanDefinition，以访问特定的子Bean定义属性
        ChildBeanDefinition childBeanDefinition = (ChildBeanDefinition) beanDefinition;
        // 检查子Bean定义中是否指定了创建者Bean和方法
        if (childBeanDefinition.getCreatorBeanName() != null && childBeanDefinition.getCreatorBeanMethodName() != null) {
            // 从Bean上下文中获取创建者Bean实例
            Object creatorBean = beanContext.getBean(childBeanDefinition.getCreatorBeanName());
            // 获取创建者Bean中定义的创建方法
            Method method = creatorBean.getClass().getMethod(childBeanDefinition.getCreatorBeanMethodName());
            // 调用创建方法并返回创建的子Bean实例
            return (T) method.invoke(creatorBean);
        }
        // 如果未指定创建者Bean和方法，返回null
        return null;
    }
}
